package 集合;
import java.util.*;
/*
  Quque接口:先进先出的线性数据结构(排队)
    实现类  LinkedList
	应用场景:请求队列，消息队列，任务
  Deque接口:双端队列，可以从头和尾取值/删除
    Queue 方法	等效 Deque 方法
    add(e)	    addLast(e)
    offer(e)	offerLast(e)
    remove()	removeFirst()
    poll()	    pollFirst()
    element()	getFirst()
    peek()	    peekFirst()
     Deque用法同quque.比比Quque多了一些检索/删除最后一个的方法如:
            getLast() peekLast() pollLast() removeLast()
			还有一些添加到头的操作，如 addFirst() offerFirst()
			两个特别方法
             boolean	removeFirstOccurrence(Object o) 
             从此双端队列移除第一次出现的指定元素。
             boolean	removeLastOccurrence(Object o) 
             从此双端队列移除最后一次出现的指定元素。
 Stack类  堆栈
 Stack 类表示(先进后出)后进先出（LIFO）的对象堆栈。
    它通过五个操作对类 Vector 进行了扩展 ，
	允许将向量视为堆栈。它提供了通常的 push 和 pop 操作，
	以及取堆栈顶点的 peek 方法、
	测试堆栈是否为空的 empty 方法、
	在堆栈中查找项并确定到堆栈顶距离的 search 方法。
*/
public class X09Quque和Deque和Stack队列与栈
{
	public static void main(String[]args){
		quque();
		stack();
	}
	private static void quque(){
		Queue<String> quque=new LinkedList<>();
		quque.add("小明");
		quque.add("小林");
		quque.add("小米");
		quque.add("小白");
		quque.add("小妮");
		quque.add("小小");
		
		System.out.println(quque.element());//取第一个元素,没有的话抛异常
		System.out.println(quque.peek());//取第一个元素，没有的话返回null
		System.out.println(quque.poll());//取第一个元素，且删除第一个元素，队列为空返回null
		System.out.println(quque.remove());//取第一个元素并删除，队列为空抛异常
		quque.offer("小明");//将指定的元素插入此队列（如果立即可行且不会违反容量限制），当使用有容量限制的队列时，此方法通常要优于 add(E)，后者可能无法插入元素，而只是抛出一个异常
		System.out.println(quque);
		
	}
	private static void stack(){
		Stack<String> stack=new Stack<>();
		stack.push("小明");//把元素push到堆栈顶部
		stack.push("小鸟");
		stack.push("小U");
		stack.push("小如");
		stack.push("小爱");
		System.out.println(stack.peek());//查看顶部对象，但不移出
		System.out.println(stack.pop());//查看并移出顶端对象
		System.out.println(stack.empty());//检测是否为空
		System.out.println(stack.peek());
		System.out.println(stack.search("小U"));//最顶部返回1，(只取距顶端最近的一个)向下依次+1,找不到的返回-1
	}
}
